﻿//===============================================================================
// Apolineo Patterns & Practices LeanEngine Framework
//===============================================================================
// Copyright © Apolineo Desenvolvimento de Sistemas Ltda.  All rights reserved.
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY
// OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT
// LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
// FITNESS FOR A PARTICULAR PURPOSE.
//===============================================================================

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq.Mapping;

using LeanEngine.SalesConcept.Validator;
using LeanEngine.SalesConcept.Business;

using LeanEngine.Entity;
using LeanEngine.Validation;

namespace LeanEngine.SalesConcept.Entity
{
    //O atributo Table do namespace System.Data.Linq.Mapping é responsável
    //por informar ao lob que a classe se refere a tabela
    //'Product' no banco de dados

    //Herdamos da classe DataTransferObject para o lob gerencie as mudanças
    //nos valores das propriedades, faça atualizações pessimistas e envie
    //no comando update somente os dados alterados, além do, versionamento
    //do dado automaticamente
    [Table(Name = "Product")]
    public class Product : ChangeTrackerEntity
    {
        #region Product Members

        //Aqui mapeamos a coluna 'Name' e adicionamos um validador para
        //assegurar que seja preenchido, e em
        //caso de erro, lança uma exceção de negócio com a mensagem de erro
        //obtida através do resource 'ErrorMessages', chave 'ProductNameRequired'
        [IsNotEmpty(typeof(ErrorMessages), "ProductNameRequired"),
        Column(Name = "Name")]
        public string Name
        {
            get;
            set;
        }

        //Aqui mapeamos a coluna 'Name'
        [Column(Name = "Color")]
        public string Color
        {
            get;
            set;
        }

        //Aqui mapeamos a coluna 'Name' e adicionamos nosso validador customizado
        //para assegurar que a data seja maior que a data atual da execução, e em
        //caso de erro, lança uma exceção de negócio com a mensagem de erro
        //obtida através do resource 'ErrorMessages', chave 'ProductYearProductionInvalid'
        [IsNowYearOrLater(typeof(ErrorMessages), "ProductYearProductionInvalid"),
        Column(Name = "YearProduction")]
        public int YearProduction
        {
            get;
            set;
        }

        //Aqui mapeamos a coluna 'Name' e adicionamos um validador para
        //assegurar que seja preenchido, e em
        //caso de erro, lança uma exceção de negócio com a mensagem de erro
        //obtida através do resource 'ErrorMessages', chave 'ProductNameRequired'
        [IsGreaterThanEqual(0, typeof(ErrorMessages), "ProductQuantityInStockInvalid"),
        Column(Name = "QuantityInStock")]
        public int QuantityInStock
        {
            get;
            set;
        }

        #endregion

        #region ITransferObject Members

        //Aqui mapeamos a coluna PK da tabela Product e informamos ao lob
        //que o valor dela é gerado pelo banco de dados
        [Column(Name = "ProductId", IsPrimaryKey = true, IsDbGenerated = true)]
        public long Id
        {
            get;
            set;
        }

        #endregion

        #region Overrided Members

        public override string ToString()
        {
            return this.Name;
        }

        #endregion
    }
}